Q: When I use CopyBits to move a cGrafPort 's portPixMap to another
cGrafPort (my printing port), it works like a charm when background printing is turned on,
but when CopyBits gets called with background printing turned off, the image that prints
isn't the image at all. Why is this happening?
A: You should be aware that since you're copying the pixels directly
from the screen, the baseAddr pointer for the screen's pixMap may be 32-bit addressed.
In fact, with 32-Bit QuickDraw, this is the case. This in itself isn't a
problem, since CopyBits knows enough to access the baseAddr of the port's
pixMap in 32-bit mode, as follows:
mode = true32b; // Make sure we're in 32-bit addressing mode.
// Access pixels directly; make no other system calls.
SwapMMUMode(&mode); // Restore the current mode.
|
That's how you'd normally handle things if you were accessing the pixels directly
yourself. Unfortunately, the LaserWriter driver doesn't know enough to do the
SwapMMUMode and instead ends up copying garbage (from a 32-bit pointer stripped
to a 24-bit pointer).
So why does background printing work? Because when you print in the background,
everything is rolled into a PICT, which the driver saves off for PrintMonitor.
Since the driver is using the standard QuickDraw picture bottlenecks to do
this, and CopyBits knows to swap the MMU mode before copying the data into the
picture, everything works great. Later, at PrintMonitor time, the picture is
played back. Since the data is no longer 32-bit addressed, the LaserWriter
driver doesn't have to call SwapMMUMode to do the right thing; it can just play
the picture back.
The solution we propose for you is something similar. At print time (before
your PrOpenPage call), call OpenPicture , copy the data from the screen with
CopyBits , call ClosePicture , and then call DrawPicture within your
PrOpenPage/PrClosePage loop. That should do the trick.
Note that copying bits directly from the screen is not something we recommend.
Unless you have no alternative, you should always copy from the original source
of the data instead.
|